#pragma once
#include "TrTypes.h"
#include "TrSingleton.h"
#include <QObject>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QTimer>
#include <QMap>
#include <QQueue>
#include <memory>
#include <functional>
#include <sw/redis++/redis++.h>

namespace Market {

// 定义回调函数类型
using BarDataCallback = std::function<void(const WTSBarStruct&)>;

struct BarRequest {
    std::string symbol;      // 合约代码
    std::string exchg;       // 交易所
    TrPeriod period;        // K线周期
    BarDataCallback callback;// 数据回调函数
    QString url;            // 请求URL
    bool isRetry{false};    // 是否是重试请求
};

class HistoryDataEngine : public QObject, public TrSingleton<HistoryDataEngine> {
    Q_OBJECT
    friend class TrSingleton<HistoryDataEngine>;
public:
    // 初始化
    bool init();
    
    // 添加需要同步的合约
    void addContract(const std::string& symbol, const std::string& exchg);
    
    // 开始同步
    void startSync();
    
    // 停止同步
    void stopSync();
    
    // 检查是否同步完成
    bool isSyncCompleted() const { return m_syncCompleted; }
    
signals:
    void syncCompleted();    // 同步完成信号
    void syncFailed(const QString& error);  // 同步失败信号
    void progressUpdated(int current, int total);  // 进度更新信号
    
private:
    explicit HistoryDataEngine(QObject* parent = nullptr);
    ~HistoryDataEngine();
    
    // 禁用拷贝和赋值
    HistoryDataEngine(const HistoryDataEngine&) = delete;
    HistoryDataEngine& operator=(const HistoryDataEngine&) = delete;
    
    // 转换合约代码（针对郑商所）
    QString convertSymbol(const std::string& symbol, const std::string& exchg);
    
    // 构建请求URL
    QString buildUrl(const BarRequest& request);
    
    // 处理网络响应
    void handleNetworkReply(QNetworkReply* reply);
    
    // 处理请求失败
    void handleRequestFailure(const QUrl& url);
    
    // 解析分钟K线数据
    bool parseMinuteData(const QByteArray& data, const BarRequest& request);
    
    // 解析日K线数据
    bool parseDailyData(const QByteArray& data, const BarRequest& request);
    
    // 将K线数据保存到Redis
    void saveToRedis(const std::string& key, const WTSBarStruct& bar, double score);
    
    // 检查Redis中的数据完整性
    void checkDataIntegrity(const BarRequest& request);
    
    // 发起下一个请求
    void processNextRequest();
    
    // 重试失败的请求
    void retryFailedRequest();
    
private:
    QNetworkAccessManager* m_networkManager{nullptr};
    QQueue<BarRequest> m_requestQueue;         // 请求队列
    QQueue<BarRequest> m_failedRequests;       // 失败的请求
    QMap<QString, QNetworkReply*> m_replies;   // 当前的网络请求
    QMap<QString, BarRequest> m_pendingRequests; // 待处理的请求
    QTimer m_retryTimer;                       // 重试定时器
    
    bool m_syncCompleted{false};               // 同步完成标志
    int m_maxRetries{3};                       // 最大重试次数
    int m_currentRetries{0};                   // 当前重试次数
    int m_maxConcurrentRequests{5};            // 最大并发请求数
    int m_activeRequests{0};                   // 当前活动请求数
    int m_totalRequests{0};                    // 总请求数
    int m_completedRequests{0};                // 已完成请求数
    
    std::vector<TrPeriod> m_periods = {        // 需要同步的周期
        TrPeriod::M1, TrPeriod::M5, 
        TrPeriod::M15, TrPeriod::M30,
        TrPeriod::H1, TrPeriod::Day
    };
};

#define HISTORY_ENGINE Market::HistoryDataEngine::instance()

} // namespace Market 